// src/utils/request.ts
import { useMemberStore } from '@/store'
/**
 * 通用网络请求封装，兼容小程序和H5，支持请求/响应拦截、token注入、全局错误处理等
 */

type RequestOptions = UniApp.RequestOptions & {
  /** 是否需要token，默认true */
  needToken?: boolean
  /** 是否自动显示loading，默认false */
  showLoading?: boolean
  /** 自定义baseUrl，默认使用全局BASE_URL */
  baseUrl?: string
}

// 全局基础地址，可根据环境变量切换
const BASE_URL = 'http://localhost:3010'

/**
 * 获取本地存储的token
 */
function getToken(): string {
  const memberStore = useMemberStore()
  if (memberStore.token.value) {
    return memberStore.token.value
  }
  // 兜底从本地存储取
  const member = uni.getStorageSync('member')
  if (typeof member === 'string') {
    try {
      return JSON.parse(member).token || ''
    } catch {
      return ''
    }
  }
  return member?.token || ''
}

/**
 * 通用请求方法
 * @param options 请求参数
 * @returns Promise<T>
 */
export function request<T = any>(options: RequestOptions): Promise<T> {
  // 请求拦截：自动拼接 baseUrl、注入 token
  // if (store.getters.token) config.headers["authorization"] = store.getters.token;
  // console.log(getToken())
  const header: Record<string, any> = options.header || {}
  if (options.needToken !== false) {
    const token = getToken()
    if (token) header['Authorization'] = `${token}`
  }
  // 所有请求统一 Content-Type
  header['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8'
  // 拼接最终请求地址
  const url = options.url.startsWith('http')
    ? options.url
    : (options.baseUrl || BASE_URL) + options.url

  // 是否显示loading
  if (options.showLoading) {
    uni.showLoading({ title: '加载中...', mask: true })
  }

  return new Promise((resolve, reject) => {
    uni.request({
      ...options,
      url,
      header,
      success: (res) => {
        // 关闭loading
        if (options.showLoading) {
          uni.hideLoading()
        }
        // 响应拦截：统一处理业务错误
        if (res.statusCode === 200) {
          // 这里根据后端返回结构自定义
          const data = res.data as any
          if (data.code === 0 || data.code === 200) {
            resolve(data) // 返回整个响应体，包含token、data、msg等
          } else {
            // 业务错误提示
            let toastMsg = '请求失败'
            if (typeof data.msg === 'string') {
              toastMsg = data.msg
            } else if (typeof data.msg === 'object') {
              toastMsg = JSON.stringify(data.msg)
            }
            uni.showToast({
              title: toastMsg,
              icon: 'none',
            })
            reject(data)
          }
        } else {
          // 网络层错误
          uni.showToast({ title: '网络错误', icon: 'none' })
          reject(res)
        }
      },
      fail: (err) => {
        // 关闭loading
        if (options.showLoading) {
          uni.hideLoading()
        }
        // 请求失败提示
        uni.showToast({ title: '请求失败', icon: 'none' })
        reject(err)
      },
    })
  })
}

/**
 * 快捷GET请求
 */
export function get<T = any>(
  url: string,
  data?: any,
  options?: Omit<RequestOptions, 'url' | 'data' | 'method'>,
) {
  return request<T>({ url, data, method: 'GET', ...options })
}

/**
 * 快捷POST请求
 */
export function post<T = any>(
  url: string,
  data?: any,
  options?: Omit<RequestOptions, 'url' | 'data' | 'method'>,
) {
  return request<T>({ url, data, method: 'POST', ...options })
}
